﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModel.h"

namespace gcmp 
{    
    class IInstance;
    class IFamily;
    class IDocument;


    /// \brief 加载子族文件返回信息
    enum class LoadSubFamilyResult : int32_t
    {
        LOAD_FAILED,                               // 加载子族错误
        LOAD_SUCCEEDED,                            // 成功加载子族
        LOAD_NONE,                                 // 子族不存在，无操作
    };

    /// \brief 嵌套构件文件相关的Utility函数集合
    class GCMP_MODEL_EXPORT NestedInstanceUtils
    {
    public:
        /// \brief 替换嵌套构件子构件实例的类型
        ///
        /// \param pSubInstance 被替换的子构件实例
        /// \param subFamilyIdPath 子构件在主构件中的Id路径
        /// \param newTypeName 替换的类型名称
        /// \return 如果成功， 则返回true， 如果失败， 则返回false
        static bool SwitchSubInstanceToType(IInstance* pSubInstance, const std::vector<Int64>& subFamilyIdPath, std::wstring newTypeName);

        /// \brief 加载子族到指定的族对象，当加载族的时候，对主文档中已经存在的族类型采取保留策略。
        ///
        /// \param pFamily 指定的族对象
        /// \param subFamilyPath 需要加载的子族文件
        /// \param oneLevel true 处理最上一层子构件，否则处理所有层子构件
        /// \param errorMessage 输出参数，如果加载失败， 失败的信息
        /// \return LoadSubFamilyResult
        static LoadSubFamilyResult LoadSubFamily(IFamily* pFamily, const std::wstring& subFamilyPath, bool oneLevel, std::wstring& errorMessage);

        /// \brief 加载子族到指定文档所有的族对象，当加载族的时候，对主文档中已经存在的族类型采取保留策略。
        ///  
        /// \param pDoc 指定的文档对象
        /// \param subFamilyPath 需要加载的子族文件
        /// \param oneLevel true 处理最上一层子构件，否则处理所有层子构件
        /// \param errorMessage 输出参数，如果加载失败， 失败的信息
        /// \return LoadSubFamilyResult
        static LoadSubFamilyResult LoadSubFamily(IDocument* pDoc, const std::wstring& subFamilyPath, bool oneLevel, std::wstring& errorMessage);

    };
}// namespace gcmp

